home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / tpl60n11.zip / INSTR.PAS < prev    next >
Pascal/Delphi Source File  |  1992-03-28  |  3KB  |  45 lines

  1. { Instr is similar to Pos, but allows to specify a start position at which the
  2.   search in the Target string for the Objct string is to start. }
  3.  
  4. FUNCTION  Instr  (Objct, Target: STRING; StartPos: BYTE): BYTE; ASSEMBLER;
  5. ASM
  6.            CLD                   { auto increment for string instructions }
  7.            PUSH    DS            { save Turbo Pascal's data segment }
  8.            LES     DI, [Target]  { pointer to target string }
  9.            LDS     SI, [Objct]   { pointer to object string }
  10.            XOR     BX, BX        { initialize }
  11.            OR      BL, [StartPos]{  start position }
  12.            JZ      @NoChange     { don't change when zero }
  13.            DEC     BX            { dekrement start position }
  14. @NoChange: LODSW                 { AL = length Object, AH = 1. char in Object }
  15.            SUB     AL, 1         { length Object - 1 }
  16.            JB      @NotFound1    { exit, if length-1 < 0 }
  17.            MOV     CL, ES: [DI]  { length target String }
  18.            MOV     CH, CL        { length traget String }
  19.            SUB     CL, AL        { length target - length Object + 1 }
  20.            JBE     @NotFound1    { if <= 0, exit }
  21.            SUB     CL, BL        { remaining length Target }
  22.            JBE     @NotFound1    { if <= 0, exit }
  23.            INC     DI            { 1. char in Target }
  24.            ADD     DI, BX        { start position in Target }
  25.            XCHG    CH, BH        { BH = length target string, CH = 0 }
  26.            XCHG    AL, AH        { AL = 1. char Object, AH = length Object }
  27.            MOV     BP, SI        { save pointer }
  28. @Search1:  REPNZ   SCASB         { scan target for 1st char of Object }
  29.            JNZ     @NotFound2    { if not found, exit }
  30.            MOV     BL, CL        { save remaining length target }
  31.            MOV     CL, AH        { char still to compare in Object }
  32.            MOV     DX, DI        { get offset into Target }
  33.            REPZ    CMPSB         { compare CX chars of Target and Object }
  34.            MOV     SI, BP        { offset into Object }
  35.            MOV     DI, DX        { offset into Target }
  36.            MOV     CL, BL        { remaining length Target }
  37.            JNZ     @Search1      { continue search if no complete match }
  38.            SUB     BH, BL        { pos = length Target - remaining length target}
  39.            SUB     BH, AH        { pos = l. Target - rem. l. target - l. Object }
  40. @NotFound1:MOV     CH, BH        { pos }
  41. @NotFound2:MOV     AL, CH        { pos }
  42.            XOR     AH, AH        { clear MSB }
  43.            POP     DS            { restore TURBO Pascal's data segment }
  44. END;
  45.